module Alu (op,a,b,sa,zero,result);
    input [3:0] op;
    input [31:0] a,b;
    input [4:0] sa;
    output zero;
    output reg[31:0] result;
    parameter   LUI_ALU = 4'b0000;
    parameter   ADD_ALU = 4'b0001;
    parameter   SUB_ALU = 4'b0010;
    parameter   AND_ALU = 4'b0011;
    parameter   OR_ALU  = 4'b0100;
    parameter   XOR_ALU = 4'b0101;
    parameter   NOR_ALU = 4'b0110;
    parameter   SLT_ALU = 4'b0111;
    parameter   SLL_ALU = 4'b1000;
    parameter   SRL_ALU = 4'b1001;
    parameter   SRA_ALU = 4'b1010;
    parameter   JR_ALU  = 4'b1011;
    parameter   SL_ALU  = 4'b1100;
    assign  zero = (result == 32'b0);
    always @(op or a or b) begin
        case(op)
        LUI_ALU: result = {b[15:0],16'b0000000000000000};
        ADD_ALU: result = a + b;
        
        SUB_ALU: result = a - b;
        AND_ALU: result = a & b;
        OR_ALU : result = a | b;
        XOR_ALU: result = a^b;
        NOR_ALU: result = ~(a|b);
        SLT_ALU: result = (a<b)?1:0;
        SLL_ALU: result = b << sa;
        SRL_ALU: result = b >> sa;
        SRA_ALU: result = $signed(b) >>> sa;
        JR_ALU : result = a;
        SL_ALU : result = b;
        endcase
    end
endmodule //alu